import store from "@/store";
import Vue from "vue";
import VueRouter from "vue-router";
import routes from "./routes";
Vue.use(VueRouter);

// 重写push方法，解决多次点击编程式路由控制台报错的问题，原型上修改push方法
const originPush = VueRouter.prototype.push  //将之前的push对象存储到一个变量身上
const originReplace = VueRouter.prototype.replace
VueRouter.prototype.push = function(location,okCallBack,errCallBack){
    if(okCallBack === undefined && errCallBack === undefined){
        //条件成立的话，表示没有传递这两个参数
        originPush.call(this,location).catch(()=>{})  //统一处理报错问题
    }else{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
        originPush.call(this,location,okCallBack,errCallBack)
    }
}

VueRouter.prototype.replace = function(location,okCallBack,errCallBack){
    if(okCallBack === undefined && errCallBack === undefined){
        originReplace.call(this,location).catch(()=>{})
    }else{
        originReplace.call(this,location,okCallBack,errCallBack)
    }
}
// 书写路由规则，router是路由对象，相当于是一个物件，类似于路由器那个硬件
let router = new VueRouter({
    mode:"history",
    routes,  //加了s是一个复数形式，表示多个路由对象，相当于是路由硬件上的网口
    scrollBehavior(to, from, savedPosition) {   //跳转后滚动条处在最上方
        if (savedPosition) {
          return savedPosition
        } else {
          return { x: 0, y: 0 }
        }
      }
})

// 白名单中的内容是不需要进行登陆就能访问的页面
const whiteList = [
    "home",
    "login",
    "register",
    "search",
    "detail",
    "addShopCart",
    "shopCart",
]
// 定义全局路由导航守卫 也就是说只要组件一跳转就会先走这个里面的逻辑
router.beforeEach((to,from,next)=>{
    // 如果用户要访问的页面是白名单里面的，或是已经登陆过了，都需要放行，否则先要进行登陆
    if(whiteList.includes(to.name) || store.state.user.userInfo.token){
        next();
        return
    }
    // 如果没有在白名单里面,则需要先登陆 如果没有登陆的话，则需要先跳转到登陆页面
  // 为了有一个更好的用户体验，在用户登陆完成之后，最好是直接跳转到之前要访问的页面
  next({
    name:'login',
     // 下面这行代码 是记录一下用户想访问的页面
     query: {
        redirect:to.path
      }
  })
})
export default router;